class Stack {
  constructor() {
    this.count = 0; // 可以类比指针或者计数器
    this.items = {};
  }

  /* 添加一个（或几个）新元素到栈顶 */
  push(element) {
    this.count++;
    this.items[this.count] = element;
  }

  /** 移除栈顶的元素，同时返回被移除的元素。 */
  pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    const element = this.items[this.count];
    delete this.items[this.count];
    this.count--;
    return element;
  }

  /* 返回栈顶的元素，不对栈做任何修改（该方法不会移除栈顶的元素，仅仅返回它） */
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count];
  }

  /** 如果栈里没有任何元素就返回true，否则返回false。 */
  isEmpty() {
    return this.count === 0;
  }

  /** 移除栈里的所有元素 */
  clear() {
    this.count = 0;
    this.items = {};
  }

  /** 返回栈里的元素个数。该方法和数组的length属性很类似。 */
  size() {
    return this.count;
  }

  toString() {
    if (this.isEmpty()) {
      return '';
    }

    let objString = `1:${this.items[1]}`;
    for (let i = 2; i <= this.count; i++) {
      objString = `${objString},${i}:${this.items[i]}`;
    }
    return objString;
  }
}

module.exports = Stack;

// const stack = new Stack();
// console.log(stack.isEmpty());
// stack.push(5);
// stack.push(8);

// console.log(stack.items);
// console.log(stack.size());
// console.log(stack.toString());

// console.log(Object.getOwnPropertyNames(stack));
// console.log(Object.keys(stack));
// console.log(stack.items);
